请求超时优化 异步数据加载

场景

页面上有多个box,每个box下都会请求数据内容

用户可以通过表单保存已选择的条件名和内容

目的

将首屏加载时同时请求数据的情况修改为首屏加载只加载上次用户保存的表单,其他box下的请求通过点击后异步加载

对首屏数据加载和异步数据加载设置超时请求处理,再次加载数据,渲染页面

方法

请求已保存条件数据的函数

function getData(url , requestData) {
    return new Promise(resolve,reject) => {
        $.get(url, requestData).done(function(data) {
            if (data.status ==1) {
                reject(new Error(data.message))
             } else {
                if (data.code === codeConfig.SUCCESS) {
                    resolve(data.data)
                } else if (data.code == null) {
                    resolve(data)
                }
             }
        }) 
   }
 }

promise请求数据超时处理

定义一个延时函数,用于给请求计时,返回promise

function timeout(delay) {
    return new Promise((resolve,reject) => {
        setTimeout(function(){
            reject("数据请求超时,请重试")
        },delay)
    })
}

在路由接口处通过Promise.race方法,Promise的all方法和race方法是相对的,all方法是[谁跑的慢,以谁为准执行回调],race则是[谁跑的快,以谁为准执行回调]。所以通过race给异步请求数据设置超时时间,超时后执行相应的操作

exports.list = function(type,identifier) {
    var timeout = commonUtil.timeout(5000)
    var promise = commonUtil.getData(url,{
        type:type,
        user:window.global_user_name
    })
    Promise
    .race([promise,timeout])
    .then (function(results){
       return results
     })
     .catch(function(reason){
        commonUtil.showMsg(reason)
     })
 }

模仿网络延时的方法

这里推荐一种模仿网络延时的方法:chrome开发者工具的network下有个throtting节流工具

150297072878

可以点Add自定义节流时间

150297073866

我测试时在promise延时函数中设置的时间为500ms,这里节流用的800ms

150297074452

设置好之后选中,Network会出现黄色的警告

15029707482

这样可以在首次加载时选择节流,点击已保存条件时会出现请求数据失败的情景,然后再去掉节流,点击重试按钮,就可以发出去请求,正常请求到数据了,然后就可以渲染到页面

在网络延时复现不了的情况下,很好的模拟了首次请求失败,点击刷新重新请求数据的情景